Djangoã®ã¯ã©ã¹ããŒã¹ãžã§ããªãã¯ãã¥ãŒãã«ã¹ã¿ãã€ãºããããã®å æ¬çãªã¬ã€ãã§ãã匷åã§å¹ççãªWebéçºã®ããã«ããã¥ãŒãç¹å®ã®ããŒãºã«åãããŠèª¿æŽããæ¹æ³ãåŠã³ãŸãããã
Djangoã¯ã©ã¹ããŒã¹ãã¥ãŒïŒãžã§ããªãã¯ãã¥ãŒã®ã«ã¹ã¿ãã€ãºã極ãã
Djangoã®ã¯ã©ã¹ããŒã¹ãã¥ãŒïŒCBVïŒã¯ãWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®åŒ·åã§åå©çšå¯èœãªæ¹æ³ãæäŸããŸãããžã§ããªãã¯ãã¥ãŒã¯ãCBVã®ãµãã»ããã§ããããªã¹ãã®è¡šç€ºã詳现ãã¥ãŒããªããžã§ã¯ãã®äœæãæŽæ°ãåé€ãšãã£ãäžè¬çãªã¿ã¹ã¯ã«å¯ŸããŠããããããæ§ç¯ããããœãªã¥ãŒã·ã§ã³ãæäŸããŸãããããã®ãžã§ããªãã¯ãã¥ãŒã¯éåžžã«äŸ¿å©ã§ãããã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®ããŒãºã«å®ç§ã«åãããããã«ã¯ã«ã¹ã¿ãã€ãºãå¿ èŠãšãªãããšããããããŸãããã®å æ¬çãªã¬ã€ãã§ã¯ãDjangoã®ãžã§ããªãã¯ãã¥ãŒãã«ã¹ã¿ãã€ãºããããã®ããŸããŸãªãã¯ããã¯ãæ¢æ±ããå¹ççã§ä¿å®æ§ã®é«ãWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®åãäžããŸãã
Djangoã®ã¯ã©ã¹ããŒã¹ãã¥ãŒãçè§£ãã
ã«ã¹ã¿ãã€ãºã«å ¥ãåã«ãCBVãšãžã§ããªãã¯ãã¥ãŒã®åºæ¬ãæ¯ãè¿ããŸããããåŸæ¥ã®é¢æ°ããŒã¹ãã¥ãŒïŒFBVïŒã¯ãåäžã®é¢æ°å ã§HTTPãªã¯ãšã¹ããçŽæ¥åŠçããŸããäžæ¹ãCBVã¯ãã¥ãŒããžãã¯ãã¯ã©ã¹ã«æŽçããããæ§é åããããªããžã§ã¯ãæåã®ã¢ãããŒããæäŸããŸããããã«ãããã³ãŒãã®æ§æãåå©çšæ§ããã¹ãå¯èœæ§ãåäžããŸãã
ãžã§ããªãã¯ãã¥ãŒã¯ãäžè¬çãªWebéçºã¿ã¹ã¯ãåŠçããããã«èšèšãããããããããæ§ç¯ãããCBVã§ãããããã¯View
ãTemplateView
ãªã©ã®åºæ¬ã¯ã©ã¹ãç¶æ¿ããå°éçãªæ©èœãæäŸããŸããäžè¬çãªãžã§ããªãã¯ãã¥ãŒã«ã¯ä»¥äžãå«ãŸããŸãã
ListView
: ãªããžã§ã¯ãã®ãªã¹ãã衚瀺ããŸããDetailView
: åäžã®ãªããžã§ã¯ãã®è©³çްã衚瀺ããŸããCreateView
: ãã©ãŒã ã䜿çšããŠãªããžã§ã¯ãã®äœæãåŠçããŸããUpdateView
: ãã©ãŒã ã䜿çšããŠãªããžã§ã¯ãã®æŽæ°ãåŠçããŸããDeleteView
: ãªããžã§ã¯ãã®åé€ãåŠçããŸãã
ãããã®ãžã§ããªãã¯ãã¥ãŒã¯åŒ·åºãªåºç€ãæäŸããŸãããå®éã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã®åäœã調æŽããå¿ èŠãããããšããããããŸããããŸããŸãªã«ã¹ã¿ãã€ãºãã¯ããã¯ãæ¢ã£ãŠã¿ãŸãããã
ã«ã¹ã¿ãã€ãºãã¯ããã¯
Djangoã®ãžã§ããªãã¯ãã¥ãŒãã«ã¹ã¿ãã€ãºããã«ã¯ãåçŽãªå±æ§ã®ãªãŒããŒã©ã€ããããããè€éãªã¡ãœããã®ãªãŒããŒã©ã€ããŸã§ãããã€ãã®æ¹æ³ããããŸããé©åãªãã¯ããã¯ã¯ãå¿ èŠãªã«ã¹ã¿ãã€ãºã®ã¬ãã«ã«ãã£ãŠç°ãªããŸãã
1. 屿§ã®ãªãŒããŒã©ã€ã
æãåçŽãªã«ã¹ã¿ãã€ãºåœ¢åŒã¯ããžã§ããªãã¯ãã¥ãŒã¯ã©ã¹ã®å±æ§ããªãŒããŒã©ã€ãããããšã§ããããã¯ãã¢ãã«ããã³ãã¬ãŒãåãã³ã³ããã¹ããªããžã§ã¯ãåãªã©ã®åºæ¬çãªããããã£ã倿Žããã®ã«æé©ã§ãã
äŸ: ListView
ã®ã«ã¹ã¿ãã€ãº
èšäºã®ãªã¹ãã衚瀺ãããããã«ã¹ã¿ã ãã³ãã¬ãŒããšç°ãªãã³ã³ããã¹ããªããžã§ã¯ãåã䜿çšããããšããŸãã
from django.views.generic import ListView
from .models import Article
class ArticleListView(ListView):
model = Article
template_name = 'articles/article_list.html'
context_object_name = 'articles'
def get_queryset(self):
return Article.objects.filter(is_published=True).order_by('-publication_date')
ãã®äŸã§ã¯ãmodel
ãtemplate_name
ãããã³context_object_name
屿§ããªãŒããŒã©ã€ãããŠããŸãããŸããget_queryset
ã¡ãœããããªãŒããŒã©ã€ãããŠãèšäºããã£ã«ã¿ãªã³ã°ããå
¬éæ¥ã§äžŠã¹æ¿ããŠããŸããget_queryset
ã¡ãœããã䜿çšãããšããªã¹ããã¥ãŒã«ã©ã®ãªããžã§ã¯ããå«ããããå¶åŸ¡ã§ããŸããããã¯ããã£ã«ã¿ãªã³ã°ãäžŠã¹æ¿ããããŒãžããŒã·ã§ã³ãå®è£
ããã®ã«åœ¹ç«ã¡ãŸãã
2. ã¡ãœããã®ãªãŒããŒã©ã€ã
ã¡ãœããã®ãªãŒããŒã©ã€ãã«ããããžã§ããªãã¯ãã¥ãŒã¯ã©ã¹ã®æ¢åã®ã¡ãœããã®åäœã倿Žã§ããŸããããã«ããããã¥ãŒã®ããžãã¯ããã詳现ã«å¶åŸ¡ã§ããŸãããªãŒããŒã©ã€ãããäžè¬çãªã¡ãœããã«ã¯ä»¥äžãå«ãŸããŸãã
get_queryset()
: ãã¥ãŒã䜿çšããã¯ãšãªã»ãããå¶åŸ¡ããŸããget_context_data()
: ãã³ãã¬ãŒãã³ã³ããã¹ãã«ããŒã¿ã远å ããŸããform_valid()
: ãã©ãŒã ã®æ£åžžãªéä¿¡ãåŠçããŸããform_invalid()
: ç¡å¹ãªãã©ãŒã ã®éä¿¡ãåŠçããŸããget_success_url()
: ãã©ãŒã ã®æ£åžžãªéä¿¡åŸã«ãªãã€ã¬ã¯ãããURLãæ±ºå®ããŸããget_object()
: DetailViewãUpdateViewãDeleteViewã®ãªããžã§ã¯ããååŸããŸã
äŸ: DetailView
ã®ã«ã¹ã¿ãã€ãº
èšäºã®è©³çްã衚瀺ãããããé¢é£ããã³ã¡ã³ãããã³ãã¬ãŒãã³ã³ããã¹ãã«å«ããããšããŸãã
from django.views.generic import DetailView
from .models import Article, Comment
class ArticleDetailView(DetailView):
model = Article
template_name = 'articles/article_detail.html'
context_object_name = 'article'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['comments'] = Comment.objects.filter(article=self.object, is_approved=True)
return context
ããã§ã¯ãget_context_data()
ã¡ãœããããªãŒããŒã©ã€ãããŠããã³ãã¬ãŒãã³ã³ããã¹ãã«comments
倿°ã远å ããŸãããããã«ãããarticle_detail.html
ãã³ãã¬ãŒãã§é¢é£ããã³ã¡ã³ãã«ç°¡åã«ã¢ã¯ã»ã¹ããŠè¡šç€ºã§ããŸãã
3. ããã¯ã¹ã€ã³ã®äœ¿çš
ããã¯ã¹ã€ã³ã¯ãç¹å®ã®æ©èœãæäŸããåå©çšå¯èœãªã¯ã©ã¹ã§ãããããã¯ãžã§ããªãã¯ãã¥ãŒãšçµã¿åãããŠããã¥ãŒã®ã³ã¢ããžãã¯ã倿Žããããšãªãæ©èœã远å ã§ããŸããDjangoã«ã¯ããã€ãã®çµã¿èŸŒã¿ããã¯ã¹ã€ã³ããããç¬èªã®ããã¯ã¹ã€ã³ãäœæããããšãã§ããŸãã
äŸ: LoginRequiredMixin
ã®äœ¿çš
LoginRequiredMixin
ã¯ããã°ã€ã³ããŠãããŠãŒã¶ãŒã®ã¿ãç¹å®ã®ãã¥ãŒã«ã¢ã¯ã»ã¹ã§ããããšãä¿èšŒããŸãã
from django.views.generic import CreateView
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import Article
from .forms import ArticleForm
class ArticleCreateView(LoginRequiredMixin, CreateView):
model = Article
form_class = ArticleForm
template_name = 'articles/article_form.html'
success_url = '/articles/' # Replace with your desired success URL
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
ãã®äŸã§ã¯ãLoginRequiredMixin
ã䜿çšããŠãArticleCreateView
ãžã®ã¢ã¯ã»ã¹ããã°ã€ã³ããŠãããŠãŒã¶ãŒã«å¶éããŸããããŸããform_valid
ã¡ãœããããªãŒããŒã©ã€ãããŠãèšäºã®äœæè
ãçŸåšã®ãŠãŒã¶ãŒã«èªåçã«èšå®ããŠããŸããããã¯ãããã¯ã¹ã€ã³ãšã¡ãœããã®ãªãŒããŒã©ã€ããçµã¿åãããŠè€éãªã«ã¹ã¿ãã€ãºãå®çŸããæ¹æ³ã瀺ããŠããŸãã
ã«ã¹ã¿ã ããã¯ã¹ã€ã³ã®äœæ
åå©çšå¯èœãªããžãã¯ãã«ãã»ã«åããããã«ãç¬èªã®ããã¯ã¹ã€ã³ãäœæããããšãã§ããŸããäŸãã°ãçŸåšã®ãŠãŒã¶ãŒãã¢ãã«ã€ã³ã¹ã¿ã³ã¹ã®äœæè ãšããŠèªåçã«èšå®ããããã¯ã¹ã€ã³ããæš©éãã§ãã¯ãåŠçããããã¯ã¹ã€ã³ãäœæããããšãã§ããŸãã
from django.contrib.auth.mixins import UserPassesTestMixin
class AuthorRequiredMixin(UserPassesTestMixin):
def test_func(self):
return self.request.user.is_staff or (self.request.user == self.get_object().author)
def handle_no_permission(self):
# Replace with your desired redirection or error handling
return redirect('permission_denied') # Or raise an exception
ãã®AuthorRequiredMixin
ã¯ãã¹ã¿ããã¡ã³ããŒãŸãã¯ãªããžã§ã¯ãã®äœæè
ã®ã¿ã«ã¢ã¯ã»ã¹ãèš±å¯ããŸãããã®ããã¯ã¹ã€ã³ãUpdateView
ãŸãã¯DeleteView
ãšçµã¿åãããŠäœ¿çšããããšã§ãèš±å¯ããããŠãŒã¶ãŒã®ã¿ããªããžã§ã¯ãã倿ŽãŸãã¯åé€ã§ããããã«ããããšãã§ããŸãã
4. ãã³ãã¬ãŒãã®ã«ã¹ã¿ãã€ãº
äžèšã®ãã¯ããã¯ããã¥ãŒã®ããžãã¯å€æŽã«çŠç¹ãåœãŠãŠããäžæ¹ã§ããã³ãã¬ãŒãã®ã«ã¹ã¿ãã€ãºã¯ããŒã¿ã®è¡šç€ºãå¶åŸ¡ããããã«äžå¯æ¬ ã§ãããžã§ããªãã¯ãã¥ãŒã¯ãã³ãã¬ãŒãã䜿çšããŠHTMLåºåãã¬ã³ããªã³ã°ããŸãããããã®ãã³ãã¬ãŒããã¢ããªã±ãŒã·ã§ã³ã®ãã¶ã€ã³ããã©ã³ãã£ã³ã°ã«åãããŠã«ã¹ã¿ãã€ãºã§ããŸãã
ãã³ãã¬ãŒãã®åœåèŠå
ãžã§ããªãã¯ãã¥ãŒã¯ç¹å®ã®ãã³ãã¬ãŒãåœåèŠåã«åŸããŸããäŸãã°ïŒ
ListView
:<app_name>/<model_name>_list.html
ïŒäŸïŒarticles/article_list.html
ïŒDetailView
:<app_name>/<model_name>_detail.html
ïŒäŸïŒarticles/article_detail.html
ïŒCreateView
/UpdateView
:<app_name>/<model_name>_form.html
ïŒäŸïŒarticles/article_form.html
ïŒDeleteView
:<app_name>/<model_name>_confirm_delete.html
ïŒäŸïŒarticles/article_confirm_delete.html
ïŒ
ãã¥ãŒã¯ã©ã¹ã§template_name
屿§ããªãŒããŒã©ã€ãããŠãç°ãªããã³ãã¬ãŒãã䜿çšã§ããŸãããã³ãã¬ãŒãå
ã§ã¯ãã³ã³ããã¹ããªããžã§ã¯ããéããŠãã¥ãŒãæäŸããããŒã¿ã«ã¢ã¯ã»ã¹ã§ããŸããããã©ã«ãã®ã³ã³ããã¹ããªããžã§ã¯ãåã¯éåžžãã¢ãã«åïŒäŸïŒArticle
ã®å Žåã¯article
ïŒã®å°æåããŒãžã§ã³ã§ããcontext_object_name
屿§ã䜿çšããŠããã倿Žã§ããŸãã
äŸ: ListView
ãã³ãã¬ãŒãã®ã«ã¹ã¿ãã€ãº
articles/article_list.html
ãã³ãã¬ãŒãã§ã¯ãarticles
ã³ã³ããã¹ã倿°ïŒäžèšã®ArticleListView
ã®äŸã§å®çŸ©ãããŠããïŒãå埩åŠçããŠãèšäºã®ãªã¹ãã衚瀺ã§ããŸãã
<h1>èšäº</h1>
<ul>
{% for article in articles %}
<li><a href="{% url 'article_detail' article.pk %}">{{ article.title }}</a></li>
{% endfor %}
</ul>
5. ãã©ãŒã ã®ã«ã¹ã¿ãã€ãº (CreateView & UpdateView)
CreateView
ãšUpdateView
ã¯ããŠãŒã¶ãŒå
¥åãåŠçããããã«Djangoãã©ãŒã ã«äŸåããŠããŸãããããã®ãã©ãŒã ãã«ã¹ã¿ãã€ãºããããšã§ã衚瀺ããããã£ãŒã«ããæ€èšŒã«ãŒã«ãããã³å€èгãå¶åŸ¡ã§ããŸãã
form_class
ã®äœ¿çš
ãã¥ãŒã¯ã©ã¹ã®form_class
屿§ã䜿çšããŠã䜿çšãããã©ãŒã ã¯ã©ã¹ãæå®ã§ããŸãããã©ãŒã ã¯ã©ã¹ãæå®ããªãå ŽåãDjangoã¯ãã¥ãŒã«é¢é£ä»ããããã¢ãã«ã«åºã¥ããŠModelForm
ãèªåçã«çæããŸãã
ãã©ãŒã ã¡ãœããã®ãªãŒããŒã©ã€ã
ãã©ãŒã ã¯ã©ã¹ã®ã¡ãœããããªãŒããŒã©ã€ãããŠããã®åäœãã«ã¹ã¿ãã€ãºã§ããŸãããªãŒããŒã©ã€ãããäžè¬çãªã¡ãœããã«ã¯ä»¥äžãå«ãŸããŸãã
__init__()
: ãã©ãŒã ãåæåãããã®ãã£ãŒã«ãã倿ŽããŸããclean()
: è€æ°ã®ãã£ãŒã«ãã«ãããã«ã¹ã¿ã ããªããŒã·ã§ã³ãå®è¡ããŸããclean_<field_name>()
: ç¹å®ã®ãã£ãŒã«ãã«å¯ŸããŠã«ã¹ã¿ã ããªããŒã·ã§ã³ãå®è¡ããŸãã
äŸ: èšäºãã©ãŒã ã®ã«ã¹ã¿ãã€ãº
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title', 'content', 'is_published']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['content'].widget = forms.Textarea(attrs={'rows': 5})
def clean_title(self):
title = self.cleaned_data['title']
if len(title) < 5:
raise forms.ValidationError("Title must be at least 5 characters long.")
return title
ãã®äŸã§ã¯ãMeta
ã¯ã©ã¹ã®fields
屿§ãèšå®ããŠããã©ãŒã ã«å«ãããã£ãŒã«ããæå®ããããšã§ãArticleForm
ãã«ã¹ã¿ãã€ãºããŸããããŸãã__init__()
ã¡ãœããããªãŒããŒã©ã€ãããŠcontent
ãã£ãŒã«ãã®ãŠã£ãžã§ãããã«ã¹ã¿ãã€ãºããclean_title()
ã¡ãœããããªãŒããŒã©ã€ãããŠtitle
ãã£ãŒã«ãã®ã«ã¹ã¿ã ããªããŒã·ã§ã³ã远å ããŠããŸãã
6. åçãªãã©ãŒã åŠç
ãŠãŒã¶ãŒããã®ä»ã®èŠå ã«åºã¥ããŠãã©ãŒã ãåçã«èª¿æŽããå¿
èŠãããå ŽåããããŸããããã¯ããã¥ãŒã¯ã©ã¹ã®get_form_kwargs()
ã¡ãœããããªãŒããŒã©ã€ãããããšã§å®çŸã§ããŸãããã®ã¡ãœããã䜿çšãããšããã©ãŒã ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«è¿œå ã®ããŒã¯ãŒãåŒæ°ãæž¡ãããšãã§ããŸãã
äŸ: ãŠãŒã¶ãŒããã©ãŒã ã«æž¡ã
from django.views.generic import CreateView
from .models import Article
from .forms import ArticleForm
class ArticleCreateView(CreateView):
model = Article
form_class = ArticleForm
template_name = 'articles/article_form.html'
success_url = '/articles/' # Replace with your desired success URL
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
ãã®åŸãArticleForm
ã®__init__()
ã¡ãœããã§ãuser
ããŒã¯ãŒãåŒæ°ãéããŠãŠãŒã¶ãŒã«ã¢ã¯ã»ã¹ã§ããŸãã
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title', 'content', 'is_published']
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user', None)
super().__init__(*args, **kwargs)
if self.user and not self.user.is_staff:
del self.fields['is_published'] # Only staff can publish
ãã®äŸã§ã¯ãçŸåšã®ãŠãŒã¶ãŒããã©ãŒã ã«æž¡ãããŠãŒã¶ãŒãã¹ã¿ããã¡ã³ããŒã§ãªãå Žåã«is_published
ãã£ãŒã«ããåçã«åé€ããŠããŸããããã¯ããŠãŒã¶ãŒã®æš©éã«åºã¥ããŠãã©ãŒã ãåçã«èª¿æŽããæ¹æ³ã瀺ããŠããŸãã
é«åºŠãªã«ã¹ã¿ãã€ãºïŒãã¥ãŒã»ããã®äœ¿çš
ããè€éãªã¢ããªã±ãŒã·ã§ã³ãç¹ã«APIãå«ãã¢ããªã±ãŒã·ã§ã³ã®å Žåã¯ãDjango REST FrameworkïŒDRFïŒã®ViewSetsã®äœ¿çšãæ€èšããŠãã ãããViewSetsã¯ãé¢é£ãããã¥ãŒïŒäŸïŒãªã¹ããäœæãååŸãæŽæ°ãåé€ïŒãåäžã®ã¯ã©ã¹ã«çµåããAPIãšã³ããã€ã³ãã管çããããã®ããã¯ãªãŒã³ã§æŽçãããæ¹æ³ãæäŸããŸãã
äŸ: ArticleViewSetã®äœæ
from rest_framework import viewsets
from .models import Article
from .serializers import ArticleSerializer
class ArticleViewSet(viewsets.ModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
ãã®ã·ã³ãã«ãªArticleViewSet
ã¯ãèšäºã®æšæºçãªCRUDïŒäœæãèªã¿åããæŽæ°ãåé€ïŒæäœããã¹ãŠæäŸããŸããget_queryset()
ãperform_create()
ãperform_update()
ãªã©ã®ã¡ãœããããªãŒããŒã©ã€ããããªã©ããžã§ããªãã¯ãã¥ãŒãšåæ§ã®ãã¯ããã¯ã䜿çšããŠViewSetsãã«ã¹ã¿ãã€ãºã§ããŸãã
ãžã§ããªãã¯ãã¥ãŒã®ã«ã¹ã¿ãã€ãºã«ãããã°ããŒãã«ãªèæ ®äºé
ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã«ãžã§ããªãã¯ãã¥ãŒãã«ã¹ã¿ãã€ãºããéã«ã¯ã以äžã®èæ ®äºé ã念é ã«çœ®ããŠãã ããã
- ããŒã«ãªãŒãŒã·ã§ã³ãšåœéå (L10n/I18n): ãã³ãã¬ãŒããšãã©ãŒã ãè€æ°ã®èšèªãšå°å圢åŒããµããŒãããŠããããšã確èªããŠãã ãããDjangoã®çµã¿èŸŒã¿i18n/l10næ©èœã䜿çšããŸãã
- ã¿ã€ã ãŸãŒã³: ãŠãŒã¶ãŒã®çŸå°æéã§æ¥ä»ãšæå»ã衚瀺ããããã«ãã¿ã€ã ãŸãŒã³å€æãæ£ããåŠçããŠãã ãããDjangoã®
timezone
ã¢ãžã¥ãŒã«ã䜿çšããŸãã - é貚æžåŒèšå®: ããŸããŸãªå°åã«åãããŠé貚å€ãé©åã«æžåŒèšå®ããŠãã ãããé貚æžåŒèšå®ã«ã¯
babel
ã®ãããªã©ã€ãã©ãªã®äœ¿çšãæ€èšããŠãã ããã - æ¥ä»ãšæ°å€ã®æžåŒèšå®: ãŠãŒã¶ãŒã®ãã±ãŒã«ã«åºã¥ããŠãé©åãªæ¥ä»ãšæ°å€ã®æžåŒã䜿çšããŠãã ããã
- ã¢ã¯ã»ã·ããªãã£: ã«ã¹ã¿ãã€ãºããããã¥ãŒãšãã³ãã¬ãŒãããé害ãæã€ãŠãŒã¶ãŒã«ãšã£ãŠã¢ã¯ã»ã·ãã«ã§ããããšã確èªããŠãã ãããWCAGã®ãããªã¢ã¯ã»ã·ããªãã£ã¬ã€ãã©ã€ã³ã«åŸã£ãŠãã ããã
- ã¬ã¹ãã³ã·ããã¶ã€ã³: ãã³ãã¬ãŒããã¬ã¹ãã³ã·ãã§ãããäžçäžã®ãŠãŒã¶ãŒã䜿çšããããŸããŸãªç»é¢ãµã€ãºãããã€ã¹ã«é©å¿ããããšã確èªããŠãã ããã
- æåãžã®é æ ®: ãã¥ãŒãšãã³ãã¬ãŒããèšèšããéã«ã¯ãæåçãªéãã«æ³šæããŠãã ãããç¹å®ã®æåã«ãšã£ãŠäžå¿«ãšãªãå¯èœæ§ã®ããç»åãèšèã®äœ¿çšã¯é¿ããŠãã ãããäŸãã°ãè²ã®é£æ³ãã·ã³ãã«ã¯æåã«ãã£ãŠå€§ããç°ãªãæå³ãæã€ããšããããŸãã
äŸ: ã¿ã€ã ãŸãŒã³ã®åŠç
ãŠãŒã¶ãŒã®çŸå°ã¿ã€ã ãŸãŒã³ã§å
¬éæ¥ã衚瀺ããã«ã¯ããã³ãã¬ãŒãã§timezone
ã¿ã°ã䜿çšã§ããŸãã
{% load tz %}
<p>å
¬éæ¥: {% timezone article.publication_date %}</p>
Djangoã®èšå®ãã¡ã€ã«ã«USE_TZ = True
ãèšå®ãããŠããããšã確èªããŠãã ããã
ãžã§ããªãã¯ãã¥ãŒã®ã«ã¹ã¿ãã€ãºã®ãã¹ããã©ã¯ãã£ã¹
ã«ã¹ã¿ãã€ãºãä¿å®å¯èœã§å¹ççã§ããããšã確å®ã«ããããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠãã ããã
- ã·ã³ãã«ã«ä¿ã€: ã«ã¹ã¿ãã€ãºãé床ã«è€éã«ããªãããã«ããŠãã ãããç®çã®çµæãéæããæãåçŽãªãã¯ããã¯ã䜿çšããŸãã
- ã³ãŒããææžåãã: ã«ã¹ã¿ãã€ãºãšãããå¿ èŠã ã£ãçç±ã説æããã³ã¡ã³ãã远å ããŸãã
- 培åºçã«ãã¹ããã: ã«ã¹ã¿ãã€ãºãæ£ããæ©èœããŠããããšã確èªããããã«åäœãã¹ããäœæããŸãã
- ããã¯ã¹ã€ã³ãè³¢ã䜿ã: äžè¬çãªæ©èœãã«ãã»ã«åããããã«åå©çšå¯èœãªããã¯ã¹ã€ã³ãäœæããŸãã
- Djangoã®èŠçŽã«åŸã: Djangoã®ã³ãŒãã£ã³ã°ã¹ã¿ã€ã«ãšåœåèŠåãéµå®ããŸãã
- ã»ãã¥ãªãã£ãèæ ®ãã: ãã¥ãŒãã«ã¹ã¿ãã€ãºããéã«ã¯ãæœåšçãªã»ãã¥ãªãã£è匱æ§ã«æ³šæããŠãã ããããŠãŒã¶ãŒå ¥åããµãã¿ã€ãºããã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°ïŒXSSïŒãSQLã€ã³ãžã§ã¯ã·ã§ã³ãªã©ã®äžè¬çãªæ»æããä¿è·ããŸãã
çµè«
Djangoã®ã¯ã©ã¹ããŒã¹ãžã§ããªãã¯ãã¥ãŒã¯ãWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®åŒ·åã§æè»ãªæ¹æ³ãæäŸããŸãããã®ã¬ã€ãã§æŠèª¬ãããŠããã«ã¹ã¿ãã€ãºãã¯ããã¯ãç¿åŸããããšã§ããžã§ããªãã¯ãã¥ãŒãç¹å®ã®ããŒãºã«åãããŠèª¿æŽããå¹ççã§ä¿å®å¯èœã§ãã°ããŒãã«ã«ã¢ã¯ã»ã¹å¯èœãªWebã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸããåçŽãªå±æ§ã®ãªãŒããŒã©ã€ããããè€éãªã¡ãœããã®ãªãŒããŒã©ã€ããããã¯ã¹ã€ã³ã®äœ¿çšãŸã§ãå¯èœæ§ã¯åºå€§ã§ããã¢ããªã±ãŒã·ã§ã³ã倿§ãªåœéçãªãªãŒãã£ãšã³ã¹ã«å¯Ÿå¿ã§ãããããã°ããŒãã«ãªèŠç¹ãšãã¹ããã©ã¯ãã£ã¹ãèæ ®ããããšãå¿ããªãã§ãã ããã